/**
 * @(#)AlarmMapper.java
 * 1.0, 2013-01-24
 */
package de.hdm.gruppenkalender.team04.db;

import de.hdm.gruppenkalender.team04.data.*;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.CE37DE28-9E66-8AFE-C5AB-17E3C2C87DA9]
// </editor-fold>
/**
 * Mapper-Klasse, die {@link Alarm}-Objekte auf eine relationale
 * Datenbank abbildet.
 * <p>
 * Hierzu wird eine Reihe von Methoden zur Verfügung gestellt, mit deren Hilfe
 * z.B. Objekte gesucht, erzeugt, modifiziert und gelöscht werden können.
 * <p>
 * In Anlehung an:
 * de.hdm.thies.bankprojekt.db.AccountMapper
 *
 * @author Prof. Dr. Peter Thies
 *
 * @author Mathias Bendel (mb167)
 * @author Björn Fichnter (bf023)
 * @author Stefan Hettich (sh176)
 * @author René Kugel (rk044)
 * @author Mark Leonberger (ml072)
 * @author Marta Przybylski (mp070)
 *
 * @version 1.0, 2013-01-24
 *
 */
public class AlarmMapper {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.816136D4-C327-4968-0337-05AD1F719298]
    // </editor-fold>
    /**
     * Die Klasse AlarmMapper wird nur einmal instantiiert. Man spricht hierbei
     * von einem sogenannten <b>Singleton</b>.
     * <p>
     * Diese Variable ist durch den Bezeichner <code>static</code> nur einmal für
     * sämtliche eventuellen Instanzen dieser Klasse vorhanden. Sie speichert die
     * einzige Instanz dieser Klasse.
     *
     * @see #alarmMapper()
     */
    private static AlarmMapper alarmMapper = null;

    /**
     * Geschützter Konstruktor - verhindert die Möglichkeit, mit new neue
     * Instanzen dieser Klasse zu erzeugen.
     */
    protected AlarmMapper() {
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.26864BBF-C2B6-AC15-FD5A-5EE1DBA6CB4E]
    // </editor-fold>
    /**
     * Diese statische Methode kann aufgrufen werden durch
     * <code>AlarmMapper.alarmMapper()</code>. Sie stellt die
     * Singleton-Eigenschaft sicher, indem Sie dafür sorgt, daß nur eine einzige
     * Instanz von <code>AlarmMapper</code> existiert.
     *
     * @return {@link AlarmMapper}-Objekt.
     * @see #alarmMapper
     */
    public static AlarmMapper alarmMapper() {
        if (alarmMapper == null) {
            alarmMapper = new AlarmMapper();
        }

        return alarmMapper;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.665271E1-B974-ECD0-9F85-2B106325F191]
    // </editor-fold>
    /**
     * Gibt ein Objekt mit übergegebener Id zurück.
     *
     * @param   id
     * @return  Alarm   {@link Alarm}-Objekt, oder null wenn keines gefunden wurde.
     */
    public Alarm findeViaSchluessel(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT alarmId, gueltigFuer FROM alarm " +
                    " WHERE alarmId =" + id + ";");

            // Prüfen, ob ein Ergebnis vorliegt.
            if (rs.next()) {
                // Umwandlung in ein {@link Alarm}-Objekt.
                Alarm a = new AlarmImpl();
                a.setId(rs.getInt("alarmId"));
                a.setGueltigFuerId(rs.getInt("gueltigFuer"));
                con.close();
                System.out.println(AlarmMapper.class.getName() +
                        " - findeViaSchluessel ausgeführt.");
                return a;
            } else {
                System.out.println(AlarmMapper.class.getName() +
                        " - findeViaSchluessel KEINE Alarme gefunden.");
            }
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return null;
    }

    /**
     * Gibt ein {@link Alarm}-Objekt zurück, das für den übergebenen
     * {@link Termin} gültig ist zurück.
     *
     * @param   termin
     * @return  Alarm   {@link Alarm}-Objekt, oder null wenn keines gefunden
     */
    public Vector<Alarm> findeViaGueltigFuer(Termin termin) {
        try {
            return this.findeViaGueltigFuer(termin.getId());
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return null;
    }

    /**
     * Gibt ein {@link Alarm}-Objekt zurück, das für die übergebene
     * {@link Termin}-Id gültig ist zurück.
     *
     * @param   terminId
     * @return  Alarm   {@link Alarm}-Objekt, oder null wenn keines gefunden
     */
    public Vector<Alarm> findeViaGueltigFuer(int terminId) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        Vector<Alarm> result = new Vector<Alarm>();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT alarmId, gueltigFuer FROM alarm " +
                    " WHERE gueltigFuer =" + terminId + ";");

            // Prüfen, ob ein Ergebnis vorliegt.
            while (rs.next()) {
                // Umwandlung in ein {@link Alarm}-Objekt.
                Alarm a = new AlarmImpl();
                a.setId(rs.getInt("alarmId"));
                a.setGueltigFuerId(rs.getInt("gueltigFuer"));
                result.add(a);
            }

            //con.close();

            System.out.println(AlarmMapper.class.getName() +
                    " - findeViaGueltigFuer ausgeführt.");
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).
                    log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }

        return result;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.52A0344D-F8FD-2BA2-7A84-667C56C5A38A]
    // </editor-fold>
    /**
     * Auslesen aller {@link Alarm}-Objekte.
     *
     * @return  Vector<Alarm>   Ein {@link Vector} mit {@link Alarm}-Objekten.
     */
    public Vector<Alarm> findeAlle() {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        Vector<Alarm> result = new Vector<Alarm>();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            ResultSet rs = stmt.executeQuery(
                    "SELECT alarmId, gueltigFuer FROM alarm " +
                    " ORDER BY alarmId");

            /**
             * Für jeden Eintrag im Suchergebnis wird nun
             * ein {@link Alarm}-Objekt erstellt.
             */
            while (rs.next()) {
                Alarm a = new AlarmImpl();
                a.setId(rs.getInt("alarmId"));
                a.setGueltigFuerId(rs.getInt("gueltigFuer"));
                result.addElement(a);
            }
            System.out.println(AlarmMapper.class.getName() +
                    " - findeAlle ausgeführt.");
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return result;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.0536E3E6-7F6E-4E3F-BF6B-03C980CA37E8]
    // </editor-fold>
    /**
     * Einfügen eines {@link Alarm}-Objekts in die Datenbank.
     * 
     * @param   a   das zu speichernde Objekt
     * @return  das gespeicherte Objekt.
     */
    public Alarm einfuegen(Alarm a) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate(
                    "INSERT INTO alarm (alarmId, gueltigFuer) " +
                    "VALUES ('" +
                    a.getId() + "', " +
                    (a.getGueltigFuerId() == 0 ? "NULL" : "'" + a.
                    getGueltigFuerId() + "'") + ");");
            con.close();
            System.out.println(AlarmMapper.class.getName() +
                    " - einfuegen ausgeführt.");
            return a;
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E2A33755-45A6-239A-D4D0-CC83999FBA15]
    // </editor-fold>
    /**
     * Wiederholtes Schreiben eines Objekts in die Datenbank.
     *
     * @param   a   das Objekt, das in die DB geschrieben werden soll
     * @return  das als Parameter übergebene Objekt
     */
    public Alarm aktualisieren(Alarm a) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate(
                    "UPDATE alarm SET gueltigFuer=" + (a.getGueltigFuerId() ==
                    0 ? "NULL" : "'" + a.getGueltigFuerId() + "'") +
                    " WHERE alarmId='" + a.getId() + "';");
            con.close();
            System.out.println(AlarmMapper.class.getName() +
                    " - aktualisieren ausgeführt.");
            return a;
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.1AE80E2F-3661-72F5-D1B6-72EA647D2810]
    // </editor-fold>
    /**
     * Löschen der Daten eines {@link Alarm}-Objekts aus der Datenbank.
     * 
     * @param   id  des aus der DB zu löschenden "Objekts".
     */
    public void loeschen(int id) {
        // DB-Verbindung holen
        Connection con = DBVerbindung.connection();

        try {
            // Leeres SQL-Statement (JDBC) anlegen
            Statement stmt = con.createStatement();

            // Statement ausfüllen und als Query an die DB schicken
            stmt.executeUpdate("DELETE FROM alarm " +
                    "WHERE alarmId=" + id);
            System.out.println(AlarmMapper.class.getName() +
                    " - loeschen ausgeführt.");
        } catch (SQLException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
    }

    /**
     * Löschen der Daten eines {@link Alarm}-Objekts aus der Datenbank.
     *
     * @param   a  das aus der DB zu löschende "Objekt".
     */
    public void loeschen(Alarm a) {
        try {
            this.loeschen(a.getId());
        } catch (RemoteException ex) {
            Logger.getLogger(AlarmMapper.class.getName()).log(Level.SEVERE, null,
                    ex);
        }
    }
}
